Run download_data.Rmd and percentage_of_regional_richness.Rmd First!

library(randomForest)
randomForest 4.6-14
Type rfNews() to see new features/changes/bug fixes.
library(reshape2)
library(rpart)
library(ggplot2)

Attaching package: ‘ggplot2’

The following object is masked from ‘package:randomForest’:

    margin
library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.1 ──
✓ tibble  3.1.2     ✓ dplyr   1.0.7
✓ tidyr   1.1.3     ✓ stringr 1.4.0
✓ readr   1.4.0     ✓ forcats 0.5.1
✓ purrr   0.3.4     
── Conflicts ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
x dplyr::combine()  masks randomForest::combine()
x dplyr::filter()   masks stats::filter()
x dplyr::lag()      masks stats::lag()
x ggplot2::margin() masks randomForest::margin()
library(multcomp)
Loading required package: mvtnorm
Loading required package: survival
Loading required package: TH.data
Loading required package: MASS

Attaching package: ‘MASS’

The following object is masked from ‘package:dplyr’:

    select


Attaching package: ‘TH.data’

The following object is masked from ‘package:MASS’:

    geyser
library(car)
Loading required package: carData
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 methods overwritten by 'car':
  method                          from
  influence.merMod                lme4
  cooks.distance.influence.merMod lme4
  dfbeta.influence.merMod         lme4
  dfbetas.influence.merMod        lme4

Attaching package: ‘car’

The following object is masked from ‘package:dplyr’:

    recode

The following object is masked from ‘package:purrr’:

    some
city_data
length(city_data$city_gdp_per_population[!is.na(city_data$city_gdp_per_population)])
[1] 30
length(city_data$percentage_urban_area_as_open_public_spaces[!is.na(city_data$percentage_urban_area_as_open_public_spaces)])
[1] 61
length(city_data$happiness_future_life[!is.na(city_data$happiness_future_life)])
[1] 65
length(city_data$mean_population_exposure_to_pm2_5_2019[!is.na(city_data$mean_population_exposure_to_pm2_5_2019)])
[1] 131
fetch_city_data_for <- function(pool_name, include_city_name = F) {
  results_filename <- paste(paste('percentage_of_regional_richness__output_', pool_name, 'city', 'richness', 'intercept', sep = "_"), "csv", sep = ".")
  results <- read_csv(results_filename)
  
  joined <- left_join(city_data, results)
  
  required_columns <- c("population_growth", "rainfall_monthly_min", "rainfall_annual_average", "rainfall_monthly_max", "temperature_annual_average", "temperature_monthly_min", "temperature_monthly_max", "happiness_negative_effect", "happiness_positive_effect", "happiness_future_life", "number_of_biomes", "realm", "biome_name", "region_20km_includes_estuary", "region_50km_includes_estuary", "region_100km_includes_estuary", "city_includes_estuary", "region_20km_average_pop_density", "region_50km_average_pop_density", "region_100km_average_pop_density", "city_max_pop_density", "city_average_pop_density", "mean_population_exposure_to_pm2_5_2019", "region_20km_cultivated", "region_20km_urban", "region_50km_cultivated", "region_50km_urban", "region_100km_cultivated", "region_100km_urban", "region_20km_elevation_delta", "region_20km_mean_elevation", "region_50km_elevation_delta", "region_50km_mean_elevation", "region_100km_elevation_delta", "region_100km_mean_elevation", "city_elevation_delta", "city_mean_elevation", "urban", "shrubs", "permanent_water", "open_forest", "herbaceous_wetland", "herbaceous_vegetation", "cultivated", "closed_forest", "share_of_population_within_400m_of_open_space", "percentage_urban_area_as_streets", "percentage_urban_area_as_open_public_spaces_and_streets", "percentage_urban_area_as_open_public_spaces", "city_gdp_per_population", "city_ndvi", "city_ssm", "city_susm", "region_20km_ndvi", "region_20km_ssm", "region_20km_susm", "region_50km_ndvi", "region_50km_ssm", "region_50km_susm", "region_100km_ndvi", "region_100km_ssm", "region_100km_susm", "city_percentage_protected", "region_20km_percentage_protected", "region_50km_percentage_protected", "region_100km_percentage_protected")
  
  if (include_city_name) {
    required_columns <- append(c("name"), required_columns)
  }
  
  required_columns <- append(c("response"), required_columns)
  
  joined[,required_columns]
}
merlin_city_data <- fetch_city_data_for('merlin')

── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  name = col_character(),
  response = col_double()
)

Joining, by = "name"
merlin_city_data
merlin_city_data_fixed <- rfImpute(response ~ ., merlin_city_data)
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    21.14   117.27 |
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    21.15   117.32 |
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    21.42   118.82 |
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    21.36   118.50 |
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    21.47   119.09 |
merlin_city_data_fixed
ggplot(merlin_city_data_fixed, aes(response)) + geom_histogram(binwidth = 2)

source('./helper__random_forest_selection_functions.R')
scale_parameter_name <- function(scale, postscript) {
  paste('region', paste(scale, 'km', sep = ''), postscript, sep = '_')  
}

scale_parameters <- function(postscript) {
  c(scale_parameter_name(20, postscript), scale_parameter_name(50, postscript), scale_parameter_name(100, postscript))
}

scales_parameters_without <- function(scale_to_exclude, postscript) {
  scales <- scale_parameters(postscript)
  scales[scales != scale_parameter_name(scale_to_exclude, postscript)]
}

select_scales <- function(urban, cultivated, elevation_delta, mean_elevation, average_pop_density, includes_estuary, ssm, susm, ndvi, percentage_protected) {
  append(
    append(
      append(
        append(
          scales_parameters_without(scale_to_exclude = urban, postscript = 'urban'),
          scales_parameters_without(scale_to_exclude = cultivated, postscript = 'cultivated')
        ),
        append(
          scales_parameters_without(scale_to_exclude = elevation_delta, postscript = 'elevation_delta'),
          scales_parameters_without(scale_to_exclude = mean_elevation, postscript = 'mean_elevation')
        )
      ),
      append(
        append(
          scales_parameters_without(scale_to_exclude = average_pop_density, postscript = 'average_pop_density'),
          scales_parameters_without(scale_to_exclude = includes_estuary, postscript = 'includes_estuary')
        ),
        append(
          scales_parameters_without(scale_to_exclude = ssm, postscript = 'ssm'),
          scales_parameters_without(scale_to_exclude = susm, postscript = 'susm')
        )
      )
    ),
    append(
      scales_parameters_without(scale_to_exclude = ndvi, postscript = 'ndvi'),
      scales_parameters_without(scale_to_exclude = percentage_protected, postscript = 'percentage_protected')
    )
  )
}
select_scales(urban = 20, cultivated = 100, elevation_delta = 20, mean_elevation = 100, average_pop_density = NA, includes_estuary = NA, ssm = 20, susm = 20, ndvi = 100, percentage_protected = NA)
 [1] "region_50km_urban"                 "region_100km_urban"                "region_20km_cultivated"            "region_50km_cultivated"            "region_50km_elevation_delta"      
 [6] "region_100km_elevation_delta"      "region_20km_mean_elevation"        "region_50km_mean_elevation"        "region_20km_average_pop_density"   "region_50km_average_pop_density"  
[11] "region_100km_average_pop_density"  "region_20km_includes_estuary"      "region_50km_includes_estuary"      "region_100km_includes_estuary"     "region_50km_ssm"                  
[16] "region_100km_ssm"                  "region_50km_susm"                  "region_100km_susm"                 "region_20km_ndvi"                  "region_50km_ndvi"                 
[21] "region_20km_percentage_protected"  "region_50km_percentage_protected"  "region_100km_percentage_protected"

select_scales(urban = , cultivated = , elevation_delta = , mean_elevation = , average_pop_density = , includes_estuary = , ssm = , susm = , ndvi =, percentage_protected = )

select_variables_from_random_forest(merlin_city_data_fixed)
 [1] "region_50km_ssm"                                         "biome_name"                                              "region_100km_ssm"                                       
 [4] "region_50km_elevation_delta"                             "region_20km_elevation_delta"                             "permanent_water"                                        
 [7] "region_20km_ssm"                                         "region_20km_urban"                                       "region_100km_elevation_delta"                           
[10] "shrubs"                                                  "city_ndvi"                                               "city_gdp_per_population"                                
[13] "region_50km_urban"                                       "region_20km_cultivated"                                  "temperature_annual_average"                             
[16] "region_50km_cultivated"                                  "region_100km_cultivated"                                 "temperature_monthly_min"                                
[19] "region_100km_susm"                                       "herbaceous_wetland"                                      "region_50km_average_pop_density"                        
[22] "region_50km_ndvi"                                        "city_max_pop_density"                                    "region_100km_average_pop_density"                       
[25] "temperature_monthly_max"                                 "happiness_positive_effect"                               "region_100km_urban"                                     
[28] "realm"                                                   "city_average_pop_density"                                "region_20km_average_pop_density"                        
[31] "region_50km_percentage_protected"                        "region_100km_percentage_protected"                       "city_ssm"                                               
[34] "city_elevation_delta"                                    "city_mean_elevation"                                     "region_50km_susm"                                       
[37] "region_20km_mean_elevation"                              "region_20km_percentage_protected"                        "herbaceous_vegetation"                                  
[40] "urban"                                                   "rainfall_monthly_max"                                    "city_percentage_protected"                              
[43] "cultivated"                                              "region_100km_mean_elevation"                             "region_20km_susm"                                       
[46] "city_susm"                                               "rainfall_annual_average"                                 "population_growth"                                      
[49] "happiness_negative_effect"                               "rainfall_monthly_min"                                    "share_of_population_within_400m_of_open_space"          
[52] "region_100km_ndvi"                                       "region_50km_mean_elevation"                              "percentage_urban_area_as_open_public_spaces_and_streets"
[55] "open_forest"                                             "region_20km_ndvi"                                        "percentage_urban_area_as_streets"                       
[58] "closed_forest"                                           "percentage_urban_area_as_open_public_spaces"            
select_variables_from_random_forest(merlin_city_data_fixed_single_scale)
 [1] "region_50km_ssm"                                         "region_50km_elevation_delta"                             "biome_name"                                             
 [4] "city_gdp_per_population"                                 "permanent_water"                                         "city_ndvi"                                              
 [7] "temperature_annual_average"                              "region_20km_cultivated"                                  "shrubs"                                                 
[10] "temperature_monthly_min"                                 "region_20km_urban"                                       "herbaceous_wetland"                                     
[13] "city_max_pop_density"                                    "city_ssm"                                                "region_50km_average_pop_density"                        
[16] "city_average_pop_density"                                "realm"                                                   "temperature_monthly_max"                                
[19] "happiness_positive_effect"                               "region_50km_percentage_protected"                        "rainfall_monthly_max"                                   
[22] "city_mean_elevation"                                     "region_100km_susm"                                       "city_percentage_protected"                              
[25] "cultivated"                                              "happiness_future_life"                                   "rainfall_annual_average"                                
[28] "urban"                                                   "happiness_negative_effect"                               "region_20km_mean_elevation"                             
[31] "share_of_population_within_400m_of_open_space"           "rainfall_monthly_min"                                    "population_growth"                                      
[34] "region_50km_ndvi"                                        "open_forest"                                             "percentage_urban_area_as_open_public_spaces_and_streets"
[37] "percentage_urban_area_as_open_public_spaces"             "closed_forest"                                           "percentage_urban_area_as_streets"                       
[40] "city_susm"                                              
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "region_50km_ssm")])
[1] "Mean  25.1327179439473 , SD:  0.216956545963824 , Mean + SD:  25.3496744899111"
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "region_50km_ssm", "region_50km_elevation_delta")])
[1] "Mean  19.6242084196811 , SD:  0.282975547429027 , Mean + SD:  19.9071839671101"
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "region_50km_ssm", "region_50km_elevation_delta", "biome_name")])
[1] "Mean  19.2510597598754 , SD:  0.237378636197946 , Mean + SD:  19.4884383960734"
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "region_50km_ssm", "region_50km_elevation_delta", "biome_name", "city_gdp_per_population")])
[1] "Mean  17.5667371783479 , SD:  0.225378699860072 , Mean + SD:  17.792115878208"
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "region_50km_ssm", "region_50km_elevation_delta", "biome_name", "city_gdp_per_population", "permanent_water")])
[1] "Mean  17.764917887126 , SD:  0.253600901946159 , Mean + SD:  18.0185187890721"
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "region_50km_ssm", "region_50km_elevation_delta", "biome_name", "city_gdp_per_population", "permanent_water", "city_ndvi")])
[1] "Mean  18.1713060031583 , SD:  0.274695354565878 , Mean + SD:  18.4460013577242"
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "region_50km_ssm", "region_50km_elevation_delta", "biome_name", "city_gdp_per_population", "permanent_water", "city_ndvi", "temperature_annual_average")])
[1] "Mean  18.4997318566786 , SD:  0.236978359007798 , Mean + SD:  18.7367102156864"
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "region_50km_ssm", "region_50km_elevation_delta", "biome_name", "city_gdp_per_population", "permanent_water", "city_ndvi", "temperature_annual_average",  "region_20km_cultivated")])
[1] "Mean  18.151366275243 , SD:  0.310327391925745 , Mean + SD:  18.4616936671687"
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "region_50km_ssm", "region_50km_elevation_delta", "biome_name", "city_gdp_per_population", "permanent_water", "city_ndvi", "temperature_annual_average",  "region_20km_cultivated", "shrubs")])
[1] "Mean  18.1996679903146 , SD:  0.32269285565908 , Mean + SD:  18.5223608459736"
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "region_50km_ssm", "region_50km_elevation_delta", "biome_name", "city_gdp_per_population", "permanent_water", "city_ndvi", "temperature_annual_average",  "region_20km_cultivated", "shrubs", "temperature_monthly_min")])
[1] "Mean  18.3993943899942 , SD:  0.305819135869039 , Mean + SD:  18.7052135258632"
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "region_50km_ssm", "region_50km_elevation_delta", "biome_name", "city_gdp_per_population", "permanent_water", "city_ndvi", "temperature_annual_average",  "region_20km_cultivated", "shrubs", "temperature_monthly_min", "region_20km_urban")])
[1] "Mean  18.2983031433913 , SD:  0.27248663139474 , Mean + SD:  18.570789774786"
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "region_50km_ssm", "region_50km_elevation_delta", "biome_name", "city_gdp_per_population", "permanent_water", "city_ndvi", "temperature_annual_average",  "region_20km_cultivated", "shrubs", "temperature_monthly_min", "region_20km_urban", "herbaceous_wetland")])
[1] "Mean  18.4617430190922 , SD:  0.256208381412962 , Mean + SD:  18.7179514005052"
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "region_50km_ssm", "region_50km_elevation_delta", "biome_name", "city_gdp_per_population", "permanent_water", "city_ndvi", "temperature_annual_average",  "region_20km_cultivated", "shrubs", "temperature_monthly_min", "region_20km_urban", "herbaceous_wetland", "city_max_pop_density")])
[1] "Mean  18.3158359875326 , SD:  0.270120208103265 , Mean + SD:  18.5859561956359"
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "region_50km_ssm", "region_50km_elevation_delta", "biome_name", "city_gdp_per_population", "permanent_water", "city_ndvi", "temperature_annual_average",  "region_20km_cultivated", "shrubs", "temperature_monthly_min", "region_20km_urban", "herbaceous_wetland", "city_max_pop_density", "city_ssm")])
[1] "Mean  18.6428753216302 , SD:  0.26630095939741 , Mean + SD:  18.9091762810276"
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "region_50km_ssm", "region_50km_elevation_delta", "biome_name", "city_gdp_per_population", "permanent_water", "city_ndvi", "temperature_annual_average",  "region_20km_cultivated", "shrubs", "temperature_monthly_min", "region_20km_urban", "herbaceous_wetland", "city_max_pop_density", "city_ssm", "region_50km_average_pop_density")])
[1] "Mean  18.8052699642646 , SD:  0.246919293071592 , Mean + SD:  19.0521892573362"
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "region_50km_ssm", "region_50km_elevation_delta", "biome_name", "city_gdp_per_population", "permanent_water", "city_ndvi", "temperature_annual_average",  "region_20km_cultivated", "shrubs", "temperature_monthly_min", "region_20km_urban", "herbaceous_wetland", "city_max_pop_density", "city_ssm", "region_50km_average_pop_density", "city_average_pop_density")])
[1] "Mean  19.0500779913321 , SD:  0.281562617871374 , Mean + SD:  19.3316406092035"
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "region_50km_ssm", "region_50km_elevation_delta", "biome_name", "city_gdp_per_population", "permanent_water", "city_ndvi", "temperature_annual_average",  "region_20km_cultivated", "shrubs", "temperature_monthly_min", "region_20km_urban", "herbaceous_wetland", "city_max_pop_density", "city_ssm", "region_50km_average_pop_density", "city_average_pop_density", "realm")])
[1] "Mean  18.9638490604482 , SD:  0.304880439343029 , Mean + SD:  19.2687294997913"
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "region_50km_ssm", "region_50km_elevation_delta", "biome_name", "city_gdp_per_population", "permanent_water", "city_ndvi", "temperature_annual_average",  "region_20km_cultivated", "shrubs", "temperature_monthly_min", "region_20km_urban", "herbaceous_wetland", "city_max_pop_density", "city_ssm", "region_50km_average_pop_density", "city_average_pop_density", "realm", "temperature_monthly_max")])
[1] "Mean  19.1737445329045 , SD:  0.30237720581189 , Mean + SD:  19.4761217387164"
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "region_50km_ssm", "region_50km_elevation_delta", "biome_name", "city_gdp_per_population", "permanent_water", "city_ndvi", "temperature_annual_average",  "region_20km_cultivated", "shrubs", "temperature_monthly_min", "region_20km_urban", "herbaceous_wetland", "city_max_pop_density", "city_ssm", "region_50km_average_pop_density", "city_average_pop_density", "realm", "temperature_monthly_max", "happiness_positive_effect")])
[1] "Mean  19.2237641823427 , SD:  0.305017487786321 , Mean + SD:  19.5287816701291"
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "region_50km_ssm", "region_50km_elevation_delta", "biome_name", "city_gdp_per_population", "permanent_water", "city_ndvi", "temperature_annual_average",  "region_20km_cultivated", "shrubs", "temperature_monthly_min", "region_20km_urban", "herbaceous_wetland", "city_max_pop_density", "city_ssm", "region_50km_average_pop_density", "city_average_pop_density", "realm", "temperature_monthly_max", "happiness_positive_effect", "region_50km_percentage_protected")])
[1] "Mean  19.2731318874597 , SD:  0.293953451788727 , Mean + SD:  19.5670853392485"
create_fifty_rows_of_oob(merlin_city_data_fixed[,c("response", "region_50km_ssm", "region_50km_elevation_delta", "biome_name", "city_gdp_per_population", "permanent_water", "city_ndvi", "temperature_annual_average",  "region_20km_cultivated", "shrubs", "temperature_monthly_min", "region_20km_urban", "herbaceous_wetland", "city_max_pop_density", "city_ssm", "region_50km_average_pop_density", "city_average_pop_density", "realm", "temperature_monthly_max", "happiness_positive_effect", "region_50km_percentage_protected", "rainfall_monthly_max")])
[1] "Mean  19.3829197721043 , SD:  0.293734015304046 , Mean + SD:  19.6766537874083"

“region_50km_ssm”, “region_50km_elevation_delta”, “biome_name”, “city_gdp_per_population”

birdlife_city_data <- fetch_city_data_for('birdlife')

── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  name = col_character(),
  response = col_double()
)

Joining, by = "name"
birdlife_city_data

birdlife_city_data_fixed <- rfImpute(response ~ ., birdlife_city_data)
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    5.641    89.30 |
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    5.686    90.01 |
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |     5.74    90.87 |
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    5.665    89.67 |
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    5.797    91.77 |
birdlife_city_data_fixed
select_variables_from_random_forest(birdlife_city_data_fixed)
 [1] "population_growth"                                       "region_50km_ssm"                                         "region_100km_ssm"                                       
 [4] "city_ndvi"                                               "region_100km_cultivated"                                 "region_50km_cultivated"                                 
 [7] "region_20km_ssm"                                         "region_100km_susm"                                       "region_20km_susm"                                       
[10] "rainfall_monthly_max"                                    "biome_name"                                              "permanent_water"                                        
[13] "temperature_monthly_min"                                 "region_50km_susm"                                        "region_20km_average_pop_density"                        
[16] "rainfall_monthly_min"                                    "city_ssm"                                                "region_50km_ndvi"                                       
[19] "region_100km_ndvi"                                       "region_20km_ndvi"                                        "percentage_urban_area_as_open_public_spaces_and_streets"
[22] "share_of_population_within_400m_of_open_space"           "region_50km_average_pop_density"                         "percentage_urban_area_as_open_public_spaces"            
[25] "mean_population_exposure_to_pm2_5_2019"                  "region_20km_cultivated"                                  "city_average_pop_density"                               
[28] "region_100km_average_pop_density"                        "region_100km_urban"                                      "temperature_annual_average"                             
[31] "region_20km_elevation_delta"                             "percentage_urban_area_as_streets"                        "rainfall_annual_average"                                
[34] "city_susm"                                               "realm"                                                   "region_50km_elevation_delta"                            
[37] "shrubs"                                                  "region_20km_urban"                                       "happiness_future_life"                                  
[40] "region_100km_percentage_protected"                       "city_max_pop_density"                                    "city_elevation_delta"                                   
[43] "region_100km_mean_elevation"                             "happiness_positive_effect"                               "region_20km_percentage_protected"                       
[46] "region_50km_urban"                                       "region_50km_percentage_protected"                        "region_50km_mean_elevation"                             
[49] "city_mean_elevation"                                     "closed_forest"                                           "herbaceous_wetland"                                     
[52] "city_gdp_per_population"                                 "urban"                                                   "region_20km_mean_elevation"                             
[55] "region_100km_elevation_delta"                            "open_forest"                                             "herbaceous_vegetation"                                  
[58] "city_percentage_protected"                               "cultivated"                                              "happiness_negative_effect"                              
[61] "temperature_monthly_max"                                
select_variables_from_random_forest(birdlife_city_data_fixed_single_scale)
 [1] "population_growth"                                       "region_50km_ssm"                                         "region_100km_cultivated"                                
 [4] "city_ndvi"                                               "biome_name"                                              "region_100km_susm"                                      
 [7] "rainfall_monthly_min"                                    "rainfall_monthly_max"                                    "city_ssm"                                               
[10] "region_20km_average_pop_density"                         "permanent_water"                                         "temperature_monthly_min"                                
[13] "percentage_urban_area_as_open_public_spaces_and_streets" "region_50km_ndvi"                                        "temperature_annual_average"                             
[16] "region_100km_urban"                                      "region_20km_elevation_delta"                             "rainfall_annual_average"                                
[19] "share_of_population_within_400m_of_open_space"           "percentage_urban_area_as_open_public_spaces"             "mean_population_exposure_to_pm2_5_2019"                 
[22] "city_average_pop_density"                                "shrubs"                                                  "city_susm"                                              
[25] "realm"                                                   "percentage_urban_area_as_streets"                        "city_max_pop_density"                                   
[28] "city_elevation_delta"                                    "city_gdp_per_population"                                 "happiness_future_life"                                  
[31] "open_forest"                                             "happiness_positive_effect"                               "closed_forest"                                          
[34] "urban"                                                   "city_mean_elevation"                                     "cultivated"                                             
[37] "temperature_monthly_max"                                 "herbaceous_vegetation"                                   "happiness_negative_effect"                              
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth")])
[1] "Mean  6.35021321550458 , SD:  0.0593939328578979 , Mean + SD:  6.40960714836247"
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm")])
[1] "Mean  4.84915699583042 , SD:  0.0818098257429198 , Mean + SD:  4.93096682157334"
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "region_100km_cultivated")])
[1] "Mean  5.28049378048091 , SD:  0.0775169354173377 , Mean + SD:  5.35801071589825"
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "region_100km_cultivated", "city_ndvi")])
[1] "Mean  5.12061471889155 , SD:  0.0874280154413976 , Mean + SD:  5.20804273433295"
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "region_100km_cultivated", "city_ndvi", "biome_name")])
[1] "Mean  5.15325796547024 , SD:  0.0694110168148363 , Mean + SD:  5.22266898228508"
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "region_100km_cultivated", "city_ndvi", "biome_name", "city_ndvi")])
[1] "Mean  5.2434172819644 , SD:  0.0806361112621407 , Mean + SD:  5.32405339322654"
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "region_100km_cultivated", "city_ndvi", "biome_name", "city_ndvi", "region_20km_average_pop_density")])
[1] "Mean  5.24489256584117 , SD:  0.0766441089091058 , Mean + SD:  5.32153667475027"
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "region_100km_cultivated", "city_ndvi", "biome_name", "city_ndvi", "region_20km_average_pop_density", "permanent_water")])
[1] "Mean  5.04554202135548 , SD:  0.0836282380010259 , Mean + SD:  5.12917025935651"
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "region_100km_cultivated", "city_ndvi", "biome_name", "city_ndvi", "region_20km_average_pop_density", "permanent_water", "temperature_monthly_min")])
[1] "Mean  5.12412938740328 , SD:  0.0730235792725426 , Mean + SD:  5.19715296667582"
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "region_100km_cultivated", "city_ndvi", "biome_name", "city_ndvi", "region_20km_average_pop_density", "permanent_water", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces_and_streets")])
[1] "Mean  5.13911115863577 , SD:  0.0955009377977672 , Mean + SD:  5.23461209643353"
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "region_100km_cultivated", "city_ndvi", "biome_name", "city_ndvi", "region_20km_average_pop_density", "permanent_water", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces_and_streets", "region_50km_ndvi")])
[1] "Mean  5.13817856130947 , SD:  0.0716785842473469 , Mean + SD:  5.20985714555681"
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "region_100km_cultivated", "city_ndvi", "biome_name", "city_ndvi", "region_20km_average_pop_density", "permanent_water", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces_and_streets", "region_50km_ndvi", "temperature_annual_average")])
[1] "Mean  5.215868046915 , SD:  0.0765190804551457 , Mean + SD:  5.29238712737014"
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "region_100km_cultivated", "city_ndvi", "biome_name", "city_ndvi", "region_20km_average_pop_density", "permanent_water", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces_and_streets", "region_50km_ndvi", "temperature_annual_average", "region_100km_urban")])
[1] "Mean  5.1564082999918 , SD:  0.0829912635065974 , Mean + SD:  5.2393995634984"
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "region_100km_cultivated", "city_ndvi", "biome_name", "city_ndvi", "region_20km_average_pop_density", "permanent_water", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces_and_streets", "region_50km_ndvi", "temperature_annual_average", "region_100km_urban", "region_20km_elevation_delta")])
[1] "Mean  5.14814218492991 , SD:  0.0749108151793109 , Mean + SD:  5.22305300010922"
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "region_100km_cultivated", "city_ndvi", "biome_name", "city_ndvi", "region_20km_average_pop_density", "permanent_water", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces_and_streets", "region_50km_ndvi", "temperature_annual_average", "region_100km_urban", "region_20km_elevation_delta", "rainfall_annual_average")])
[1] "Mean  5.23244059006495 , SD:  0.0774719747962131 , Mean + SD:  5.30991256486116"
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "region_100km_cultivated", "city_ndvi", "biome_name", "city_ndvi", "region_20km_average_pop_density", "permanent_water", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces_and_streets", "region_50km_ndvi", "temperature_annual_average", "region_100km_urban", "region_20km_elevation_delta", "rainfall_annual_average", "share_of_population_within_400m_of_open_space")])
[1] "Mean  5.23874499037273 , SD:  0.0863811628674503 , Mean + SD:  5.32512615324018"
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "region_100km_cultivated", "city_ndvi", "biome_name", "city_ndvi", "region_20km_average_pop_density", "permanent_water", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces_and_streets", "region_50km_ndvi", "temperature_annual_average", "region_100km_urban", "region_20km_elevation_delta", "rainfall_annual_average", "share_of_population_within_400m_of_open_space", "percentage_urban_area_as_open_public_spaces")])
[1] "Mean  5.35567550025148 , SD:  0.0933112444550703 , Mean + SD:  5.44898674470655"
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "region_100km_cultivated", "city_ndvi", "biome_name", "city_ndvi", "region_20km_average_pop_density", "permanent_water", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces_and_streets", "region_50km_ndvi", "temperature_annual_average", "region_100km_urban", "region_20km_elevation_delta", "rainfall_annual_average", "share_of_population_within_400m_of_open_space", "percentage_urban_area_as_open_public_spaces", "mean_population_exposure_to_pm2_5_2019")])
[1] "Mean  5.36212621452981 , SD:  0.0841422083666618 , Mean + SD:  5.44626842289647"
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "region_100km_cultivated", "city_ndvi", "biome_name", "city_ndvi", "region_20km_average_pop_density", "permanent_water", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces_and_streets", "region_50km_ndvi", "temperature_annual_average", "region_100km_urban", "region_20km_elevation_delta", "rainfall_annual_average", "share_of_population_within_400m_of_open_space", "percentage_urban_area_as_open_public_spaces", "mean_population_exposure_to_pm2_5_2019", "city_average_pop_density")])
[1] "Mean  5.38148077142908 , SD:  0.0792499982773259 , Mean + SD:  5.46073076970641"
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "region_100km_cultivated", "city_ndvi", "biome_name", "city_ndvi", "region_20km_average_pop_density", "permanent_water", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces_and_streets", "region_50km_ndvi", "temperature_annual_average", "region_100km_urban", "region_20km_elevation_delta", "rainfall_annual_average", "share_of_population_within_400m_of_open_space", "percentage_urban_area_as_open_public_spaces", "mean_population_exposure_to_pm2_5_2019", "city_average_pop_density", "shrubs")])
[1] "Mean  5.37060887208482 , SD:  0.100105116953198 , Mean + SD:  5.47071398903801"
create_fifty_rows_of_oob(birdlife_city_data_fixed[,c("response", "population_growth", "region_50km_ssm", "region_100km_cultivated", "city_ndvi", "biome_name", "city_ndvi", "region_20km_average_pop_density", "permanent_water", "temperature_monthly_min", "percentage_urban_area_as_open_public_spaces_and_streets", "region_50km_ndvi", "temperature_annual_average", "region_100km_urban", "region_20km_elevation_delta", "rainfall_annual_average", "share_of_population_within_400m_of_open_space", "percentage_urban_area_as_open_public_spaces", "mean_population_exposure_to_pm2_5_2019", "city_average_pop_density", "shrubs", "city_susm")])
[1] "Mean  5.47535632462927 , SD:  0.0825514964435405 , Mean + SD:  5.55790782107281"

“population_growth”, “region_50km_ssm”

So….
Merlin: “region_50km_ssm”, “region_50km_elevation_delta”, “biome_name”, “city_gdp_per_population” Birdlife: “population_growth”, “region_50km_ssm”

Try Modelling

library(boot)

Attaching package: ‘boot’

The following object is masked from ‘package:car’:

    logit

The following object is masked from ‘package:survival’:

    aml
merlin_city_data_named <- fetch_city_data_for('merlin', T)

── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  name = col_character(),
  response = col_double()
)

Joining, by = "name"
birdlife_city_data_named <- fetch_city_data_for('birdlife', T)

── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  name = col_character(),
  response = col_double()
)

Joining, by = "name"
Use cross validation and dropping terms to find best model

full model: response ~ region_50km_ssm + region_50km_elevation_delta + biome_name + city_gdp_per_population + population_growth

Merlin data set

cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + region_50km_elevation_delta + biome_name + city_gdp_per_population + population_growth, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.47322

– CVE 19.47322 – Can we drop one?

cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_elevation_delta + biome_name + city_gdp_per_population + population_growth, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.7365
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + biome_name + city_gdp_per_population + population_growth, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.68562
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + region_50km_elevation_delta + city_gdp_per_population + population_growth, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.35732
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + region_50km_elevation_delta + biome_name + population_growth, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.39392
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + region_50km_elevation_delta + biome_name + city_gdp_per_population, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.12951

– drop biome_name to give smaller CVE of 18.35732 – can we drop another?

cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_elevation_delta + city_gdp_per_population + population_growth, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.49017
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + city_gdp_per_population + population_growth, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.60964
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + region_50km_elevation_delta + population_growth, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.26184
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + region_50km_elevation_delta + city_gdp_per_population, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.02666

– drop population_growth to give CVE of 18.02666 – can we drop another?

cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_elevation_delta + city_gdp_per_population, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.15699
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + city_gdp_per_population, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.29845
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + region_50km_elevation_delta, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 17.9362

– drop city_gdp_per_population to give CVE of 17.9362 – can we drop another?

cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_elevation_delta, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.04985
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.241
– best model with region_50km_ssm + region_50km_elevation_delta (CV error 17.9362)
summary(glm(data = merlin_city_data_fixed, formula = response ~ region_50km_ssm + region_50km_elevation_delta))

Call:
glm(formula = response ~ region_50km_ssm + region_50km_elevation_delta, 
    data = merlin_city_data_fixed)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-7.6984  -2.8713  -0.5247   1.7119  16.9525  

Coefficients:
                              Estimate Std. Error t value Pr(>|t|)  
(Intercept)                  2.6583859  1.1311108   2.350   0.0202 *
region_50km_ssm             -0.1288796  0.0689039  -1.870   0.0636 .
region_50km_elevation_delta -0.0007078  0.0003457  -2.047   0.0426 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 17.38331)

    Null deviance: 2469.6  on 136  degrees of freedom
Residual deviance: 2329.4  on 134  degrees of freedom
AIC: 784.96

Number of Fisher Scoring iterations: 2

Birdlife data set

cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + region_50km_elevation_delta + biome_name + city_gdp_per_population + population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.755749

– can we drop a variable?

cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_elevation_delta + biome_name + city_gdp_per_population + population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.701032
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + biome_name + city_gdp_per_population + population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.906615
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + region_50km_elevation_delta + city_gdp_per_population + population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.455193
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + region_50km_elevation_delta + biome_name + population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.768164
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + region_50km_elevation_delta + biome_name + city_gdp_per_population, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.63928

– drop biome_name to give CVE of 6.455193 – can we drop another?

cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_elevation_delta + city_gdp_per_population + population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.515736
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + city_gdp_per_population + population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.38495
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + region_50km_elevation_delta + population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.417311
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + region_50km_elevation_delta + city_gdp_per_population, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.392071

– drop region_50km_elevation_delta to give CVE of 6.38495 – can we drop another?

cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ city_gdp_per_population + population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.476147
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.342025
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + city_gdp_per_population, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.331564

– drop population_growth to give CVE of 6.331564 – can we drop another?

cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ city_gdp_per_population, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.414695
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.291299

– drop city_gdp_per_population to give CVE of 6.291299 – is this better than no variable?

cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ 1, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.395701

– yes, just!

– so best model with birdlife is region_50km_ssm
summary(glm(data = birdlife_city_data_fixed, formula = response ~ region_50km_ssm))

Call:
glm(formula = response ~ region_50km_ssm, data = birdlife_city_data_fixed)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-4.5353  -1.5461  -0.4124   1.3071  10.7572  

Coefficients:
                Estimate Std. Error t value Pr(>|t|)  
(Intercept)      1.26916    0.65041   1.951   0.0531 .
region_50km_ssm -0.08499    0.04115  -2.065   0.0408 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 6.214378)

    Null deviance: 865.45  on 136  degrees of freedom
Residual deviance: 838.94  on 135  degrees of freedom
AIC: 643.06

Number of Fisher Scoring iterations: 2
Lets look at SSM for both pools
ggplot(merlin_city_data_fixed_no_boreal, aes(x = region_50km_ssm, y = response)) + geom_point() + geom_smooth(method = "glm", se = F)
`geom_smooth()` using formula 'y ~ x'

ggplot(birdlife_city_data_fixed_no_boreal, aes(x = region_50km_ssm, y = response)) + geom_point() + geom_smooth(method = "glm", se = F)
`geom_smooth()` using formula 'y ~ x'

and include region_50km_elevation_delta for merlin
ggplot(merlin_city_data_fixed_no_boreal, aes(x = region_50km_ssm, y = response, size = region_50km_elevation_delta)) + geom_point() + geom_smooth(method = "glm", se = F)
`geom_smooth()` using formula 'y ~ x'

Check birdlife model fit
birdlife.fit <- glm(data = birdlife_city_data_fixed_no_boreal, formula = response ~ region_50km_ssm)
summary(birdlife.fit)

Call:
glm(formula = response ~ region_50km_ssm, data = birdlife_city_data_fixed_no_boreal)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-4.5693  -1.5460  -0.4392   1.2913  10.7264  

Coefficients:
                Estimate Std. Error t value Pr(>|t|)  
(Intercept)      1.23286    0.65157   1.892   0.0606 .
region_50km_ssm -0.08135    0.04133  -1.969   0.0511 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 6.216274)

    Null deviance: 857.07  on 135  degrees of freedom
Residual deviance: 832.98  on 134  degrees of freedom
AIC: 638.43

Number of Fisher Scoring iterations: 2
with(summary(birdlife.fit), 1 - deviance/null.deviance)
[1] 0.02810766
plot(birdlife.fit)

ggplot(birdlife_city_data_fixed_no_boreal, aes(x = region_50km_ssm, y = response)) + 
  geom_point(size=1) + 
  geom_smooth(method = "glm", se = F) +
  geom_text(aes(label = name), data = birdlife_city_data_fixed_no_boreal[c(16, 53, 72),], size = 3, position = "dodge", vjust = "inward", hjust = "inward", color = "red", angle=-15) +
  geom_point(data = birdlife_city_data_fixed_no_boreal[c(16, 53, 72),], color = "red") +
  theme_bw() +
  ylab("City Random Effect Intercept") + xlab("Regional (50km) SSM") + labs(title = "Birdlife")
`geom_smooth()` using formula 'y ~ x'
Warning: Width not defined. Set with `position_dodge(width = ?)`
ggsave("city_effect_richness__output__birdlife.jpg")
Saving 7.29 x 4.51 in image
`geom_smooth()` using formula 'y ~ x'
Warning: Width not defined. Set with `position_dodge(width = ?)`

Check Merlin model fit
merlin.fit <- glm(data = merlin_city_data_fixed_no_boreal, formula = response ~ region_50km_ssm + region_50km_elevation_delta)
summary(merlin.fit)

Call:
glm(formula = response ~ region_50km_ssm + region_50km_elevation_delta, 
    data = merlin_city_data_fixed_no_boreal)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-7.7040  -2.8410  -0.5643   1.7350  16.9652  

Coefficients:
                              Estimate Std. Error t value Pr(>|t|)  
(Intercept)                  2.6290037  1.1334734   2.319   0.0219 *
region_50km_ssm             -0.1238835  0.0693129  -1.787   0.0762 .
region_50km_elevation_delta -0.0007285  0.0003473  -2.097   0.0378 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 17.43624)

    Null deviance: 2458.9  on 135  degrees of freedom
Residual deviance: 2319.0  on 133  degrees of freedom
AIC: 779.68

Number of Fisher Scoring iterations: 2
with(summary(merlin.fit), 1 - deviance/null.deviance)
[1] 0.05688841
plot(merlin.fit)

ggplot(merlin_city_data_fixed_no_boreal, aes(x = region_50km_ssm, y = response)) + 
  geom_point(aes(size = region_50km_elevation_delta)) + 
  geom_smooth(method = "glm", se = F) +
  geom_text(aes(label = name), data = merlin_city_data_fixed_no_boreal[c(24, 30, 42),], size = 3, position = "dodge", vjust = "inward", hjust = "inward", color = "red", angle=-15) +
  geom_point(data = merlin_city_data_fixed_no_boreal[c(24, 30, 42),], color = "red") +
  theme_bw() +
  theme(legend.position="bottom") +
  ylab("City Random Effect Intercept") + xlab("Regional (50km) SSM") + labs(title = "eBird") + guides(size=guide_legend(title="Regional (50km) Elevation Delta"))
`geom_smooth()` using formula 'y ~ x'
Warning: Width not defined. Set with `position_dodge(width = ?)`
ggsave("city_effect_richness__output__merlin.jpg")
Saving 7.29 x 4.51 in image
`geom_smooth()` using formula 'y ~ x'
Warning: Width not defined. Set with `position_dodge(width = ?)`

How much variation have we explained?
merlin_city_data_fixed_no_boreal$residuals <- resid(merlin.fit)
ggplot(merlin_city_data_fixed_no_boreal, aes(y = response, x = residuals)) + 
  geom_smooth(method = "lm", se = F) +
  geom_point(aes(color = realm)) + 
  geom_text(aes(label = name), data = merlin_city_data_fixed_no_boreal[c(24, 30, 42),], size = 4, position = "dodge", vjust = "inward", hjust = "inward") + 
  labs(title = "Merlin", subtitle = paste("Correlation", cor(merlin_city_data_fixed_no_boreal$residuals, merlin_city_data_fixed_no_boreal$response))) +
  theme_bw()
`geom_smooth()` using formula 'y ~ x'
Warning: Width not defined. Set with `position_dodge(width = ?)`

ggplot(birdlife_city_data_fixed_no_boreal, aes(y = response, x = residuals)) + 
  geom_smooth(method = "lm", se = F, alpha = 0.5) +
  geom_point(aes(color = realm)) + 
  geom_text(aes(label = name), data = birdlife_city_data_fixed_no_boreal[c(16, 53, 72),], size = 4, position = "dodge", vjust = "inward", hjust = "inward") +
  labs(title = "Birdlife", subtitle = paste("Correlation", cor(birdlife_city_data_fixed_no_boreal$residuals, birdlife_city_data_fixed_no_boreal$response))) +
  theme_bw()
`geom_smooth()` using formula 'y ~ x'
Warning: Width not defined. Set with `position_dodge(width = ?)`

Check AIC
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpSdW4gYGRvd25sb2FkX2RhdGEuUm1kYCBhbmQgYHBlcmNlbnRhZ2Vfb2ZfcmVnaW9uYWxfcmljaG5lc3MuUm1kYCBGaXJzdCEKCmBgYHtyIHNldHVwfQpsaWJyYXJ5KHJhbmRvbUZvcmVzdCkKbGlicmFyeShyZXNoYXBlMikKbGlicmFyeShycGFydCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKCmxpYnJhcnkobXVsdGNvbXApCmxpYnJhcnkoY2FyKQpgYGAKCmBgYHtyfQpjaXR5X2RhdGEKYGBgCgpgYGB7cn0KbGVuZ3RoKGNpdHlfZGF0YSRjaXR5X2dkcF9wZXJfcG9wdWxhdGlvblshaXMubmEoY2l0eV9kYXRhJGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uKV0pCmxlbmd0aChjaXR5X2RhdGEkcGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlc1shaXMubmEoY2l0eV9kYXRhJHBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXMpXSkKbGVuZ3RoKGNpdHlfZGF0YSRoYXBwaW5lc3NfZnV0dXJlX2xpZmVbIWlzLm5hKGNpdHlfZGF0YSRoYXBwaW5lc3NfZnV0dXJlX2xpZmUpXSkKbGVuZ3RoKGNpdHlfZGF0YSRtZWFuX3BvcHVsYXRpb25fZXhwb3N1cmVfdG9fcG0yXzVfMjAxOVshaXMubmEoY2l0eV9kYXRhJG1lYW5fcG9wdWxhdGlvbl9leHBvc3VyZV90b19wbTJfNV8yMDE5KV0pCmBgYAoKYGBge3J9CmZldGNoX2NpdHlfZGF0YV9mb3IgPC0gZnVuY3Rpb24ocG9vbF9uYW1lLCBpbmNsdWRlX2NpdHlfbmFtZSA9IEYpIHsKICByZXN1bHRzX2ZpbGVuYW1lIDwtIHBhc3RlKHBhc3RlKCdwZXJjZW50YWdlX29mX3JlZ2lvbmFsX3JpY2huZXNzX19vdXRwdXRfJywgcG9vbF9uYW1lLCAnY2l0eScsICdyaWNobmVzcycsICdpbnRlcmNlcHQnLCBzZXAgPSAiXyIpLCAiY3N2Iiwgc2VwID0gIi4iKQogIHJlc3VsdHMgPC0gcmVhZF9jc3YocmVzdWx0c19maWxlbmFtZSkKICAKICBqb2luZWQgPC0gbGVmdF9qb2luKGNpdHlfZGF0YSwgcmVzdWx0cykKICAKICByZXF1aXJlZF9jb2x1bW5zIDwtIGMoInBvcHVsYXRpb25fZ3Jvd3RoIiwgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInJhaW5mYWxsX2FubnVhbF9hdmVyYWdlIiwgInJhaW5mYWxsX21vbnRobHlfbWF4IiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWF4IiwgImhhcHBpbmVzc19uZWdhdGl2ZV9lZmZlY3QiLCAiaGFwcGluZXNzX3Bvc2l0aXZlX2VmZmVjdCIsICJoYXBwaW5lc3NfZnV0dXJlX2xpZmUiLCAibnVtYmVyX29mX2Jpb21lcyIsICJyZWFsbSIsICJiaW9tZV9uYW1lIiwgInJlZ2lvbl8yMGttX2luY2x1ZGVzX2VzdHVhcnkiLCAicmVnaW9uXzUwa21faW5jbHVkZXNfZXN0dWFyeSIsICJyZWdpb25fMTAwa21faW5jbHVkZXNfZXN0dWFyeSIsICJjaXR5X2luY2x1ZGVzX2VzdHVhcnkiLCAicmVnaW9uXzIwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJyZWdpb25fNTBrbV9hdmVyYWdlX3BvcF9kZW5zaXR5IiwgInJlZ2lvbl8xMDBrbV9hdmVyYWdlX3BvcF9kZW5zaXR5IiwgImNpdHlfbWF4X3BvcF9kZW5zaXR5IiwgImNpdHlfYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJtZWFuX3BvcHVsYXRpb25fZXhwb3N1cmVfdG9fcG0yXzVfMjAxOSIsICJyZWdpb25fMjBrbV9jdWx0aXZhdGVkIiwgInJlZ2lvbl8yMGttX3VyYmFuIiwgInJlZ2lvbl81MGttX2N1bHRpdmF0ZWQiLCAicmVnaW9uXzUwa21fdXJiYW4iLCAicmVnaW9uXzEwMGttX2N1bHRpdmF0ZWQiLCAicmVnaW9uXzEwMGttX3VyYmFuIiwgInJlZ2lvbl8yMGttX2VsZXZhdGlvbl9kZWx0YSIsICJyZWdpb25fMjBrbV9tZWFuX2VsZXZhdGlvbiIsICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiLCAicmVnaW9uXzUwa21fbWVhbl9lbGV2YXRpb24iLCAicmVnaW9uXzEwMGttX2VsZXZhdGlvbl9kZWx0YSIsICJyZWdpb25fMTAwa21fbWVhbl9lbGV2YXRpb24iLCAiY2l0eV9lbGV2YXRpb25fZGVsdGEiLCAiY2l0eV9tZWFuX2VsZXZhdGlvbiIsICJ1cmJhbiIsICJzaHJ1YnMiLCAicGVybWFuZW50X3dhdGVyIiwgIm9wZW5fZm9yZXN0IiwgImhlcmJhY2VvdXNfd2V0bGFuZCIsICJoZXJiYWNlb3VzX3ZlZ2V0YXRpb24iLCAiY3VsdGl2YXRlZCIsICJjbG9zZWRfZm9yZXN0IiwgInNoYXJlX29mX3BvcHVsYXRpb25fd2l0aGluXzQwMG1fb2Zfb3Blbl9zcGFjZSIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfc3RyZWV0cyIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzX2FuZF9zdHJlZXRzIiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXMiLCAiY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24iLCAiY2l0eV9uZHZpIiwgImNpdHlfc3NtIiwgImNpdHlfc3VzbSIsICJyZWdpb25fMjBrbV9uZHZpIiwgInJlZ2lvbl8yMGttX3NzbSIsICJyZWdpb25fMjBrbV9zdXNtIiwgInJlZ2lvbl81MGttX25kdmkiLCAicmVnaW9uXzUwa21fc3NtIiwgInJlZ2lvbl81MGttX3N1c20iLCAicmVnaW9uXzEwMGttX25kdmkiLCAicmVnaW9uXzEwMGttX3NzbSIsICJyZWdpb25fMTAwa21fc3VzbSIsICJjaXR5X3BlcmNlbnRhZ2VfcHJvdGVjdGVkIiwgInJlZ2lvbl8yMGttX3BlcmNlbnRhZ2VfcHJvdGVjdGVkIiwgInJlZ2lvbl81MGttX3BlcmNlbnRhZ2VfcHJvdGVjdGVkIiwgInJlZ2lvbl8xMDBrbV9wZXJjZW50YWdlX3Byb3RlY3RlZCIpCiAgCiAgaWYgKGluY2x1ZGVfY2l0eV9uYW1lKSB7CiAgICByZXF1aXJlZF9jb2x1bW5zIDwtIGFwcGVuZChjKCJuYW1lIiksIHJlcXVpcmVkX2NvbHVtbnMpCiAgfQogIAogIHJlcXVpcmVkX2NvbHVtbnMgPC0gYXBwZW5kKGMoInJlc3BvbnNlIiksIHJlcXVpcmVkX2NvbHVtbnMpCiAgCiAgam9pbmVkWyxyZXF1aXJlZF9jb2x1bW5zXQp9CmBgYAoKCmBgYHtyfQptZXJsaW5fY2l0eV9kYXRhIDwtIGZldGNoX2NpdHlfZGF0YV9mb3IoJ21lcmxpbicpCm1lcmxpbl9jaXR5X2RhdGEKYGBgCgpgYGB7cn0KbWVybGluX2NpdHlfZGF0YV9maXhlZCA8LSByZkltcHV0ZShyZXNwb25zZSB+IC4sIG1lcmxpbl9jaXR5X2RhdGEpCm1lcmxpbl9jaXR5X2RhdGFfZml4ZWQKYGBgCgpgYGB7cn0KZ2dwbG90KG1lcmxpbl9jaXR5X2RhdGFfZml4ZWQsIGFlcyhyZXNwb25zZSkpICsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAyKQpgYGAKCmBgYHtyfQpzb3VyY2UoJy4vaGVscGVyX19yYW5kb21fZm9yZXN0X3NlbGVjdGlvbl9mdW5jdGlvbnMuUicpCmBgYAoKYGBge3J9CnNjYWxlX3BhcmFtZXRlcl9uYW1lIDwtIGZ1bmN0aW9uKHNjYWxlLCBwb3N0c2NyaXB0KSB7CiAgcGFzdGUoJ3JlZ2lvbicsIHBhc3RlKHNjYWxlLCAna20nLCBzZXAgPSAnJyksIHBvc3RzY3JpcHQsIHNlcCA9ICdfJykgIAp9CgpzY2FsZV9wYXJhbWV0ZXJzIDwtIGZ1bmN0aW9uKHBvc3RzY3JpcHQpIHsKICBjKHNjYWxlX3BhcmFtZXRlcl9uYW1lKDIwLCBwb3N0c2NyaXB0KSwgc2NhbGVfcGFyYW1ldGVyX25hbWUoNTAsIHBvc3RzY3JpcHQpLCBzY2FsZV9wYXJhbWV0ZXJfbmFtZSgxMDAsIHBvc3RzY3JpcHQpKQp9CgpzY2FsZXNfcGFyYW1ldGVyc193aXRob3V0IDwtIGZ1bmN0aW9uKHNjYWxlX3RvX2V4Y2x1ZGUsIHBvc3RzY3JpcHQpIHsKICBzY2FsZXMgPC0gc2NhbGVfcGFyYW1ldGVycyhwb3N0c2NyaXB0KQogIHNjYWxlc1tzY2FsZXMgIT0gc2NhbGVfcGFyYW1ldGVyX25hbWUoc2NhbGVfdG9fZXhjbHVkZSwgcG9zdHNjcmlwdCldCn0KCnNlbGVjdF9zY2FsZXMgPC0gZnVuY3Rpb24odXJiYW4sIGN1bHRpdmF0ZWQsIGVsZXZhdGlvbl9kZWx0YSwgbWVhbl9lbGV2YXRpb24sIGF2ZXJhZ2VfcG9wX2RlbnNpdHksIGluY2x1ZGVzX2VzdHVhcnksIHNzbSwgc3VzbSwgbmR2aSwgcGVyY2VudGFnZV9wcm90ZWN0ZWQpIHsKICBhcHBlbmQoCiAgICBhcHBlbmQoCiAgICAgIGFwcGVuZCgKICAgICAgICBhcHBlbmQoCiAgICAgICAgICBzY2FsZXNfcGFyYW1ldGVyc193aXRob3V0KHNjYWxlX3RvX2V4Y2x1ZGUgPSB1cmJhbiwgcG9zdHNjcmlwdCA9ICd1cmJhbicpLAogICAgICAgICAgc2NhbGVzX3BhcmFtZXRlcnNfd2l0aG91dChzY2FsZV90b19leGNsdWRlID0gY3VsdGl2YXRlZCwgcG9zdHNjcmlwdCA9ICdjdWx0aXZhdGVkJykKICAgICAgICApLAogICAgICAgIGFwcGVuZCgKICAgICAgICAgIHNjYWxlc19wYXJhbWV0ZXJzX3dpdGhvdXQoc2NhbGVfdG9fZXhjbHVkZSA9IGVsZXZhdGlvbl9kZWx0YSwgcG9zdHNjcmlwdCA9ICdlbGV2YXRpb25fZGVsdGEnKSwKICAgICAgICAgIHNjYWxlc19wYXJhbWV0ZXJzX3dpdGhvdXQoc2NhbGVfdG9fZXhjbHVkZSA9IG1lYW5fZWxldmF0aW9uLCBwb3N0c2NyaXB0ID0gJ21lYW5fZWxldmF0aW9uJykKICAgICAgICApCiAgICAgICksCiAgICAgIGFwcGVuZCgKICAgICAgICBhcHBlbmQoCiAgICAgICAgICBzY2FsZXNfcGFyYW1ldGVyc193aXRob3V0KHNjYWxlX3RvX2V4Y2x1ZGUgPSBhdmVyYWdlX3BvcF9kZW5zaXR5LCBwb3N0c2NyaXB0ID0gJ2F2ZXJhZ2VfcG9wX2RlbnNpdHknKSwKICAgICAgICAgIHNjYWxlc19wYXJhbWV0ZXJzX3dpdGhvdXQoc2NhbGVfdG9fZXhjbHVkZSA9IGluY2x1ZGVzX2VzdHVhcnksIHBvc3RzY3JpcHQgPSAnaW5jbHVkZXNfZXN0dWFyeScpCiAgICAgICAgKSwKICAgICAgICBhcHBlbmQoCiAgICAgICAgICBzY2FsZXNfcGFyYW1ldGVyc193aXRob3V0KHNjYWxlX3RvX2V4Y2x1ZGUgPSBzc20sIHBvc3RzY3JpcHQgPSAnc3NtJyksCiAgICAgICAgICBzY2FsZXNfcGFyYW1ldGVyc193aXRob3V0KHNjYWxlX3RvX2V4Y2x1ZGUgPSBzdXNtLCBwb3N0c2NyaXB0ID0gJ3N1c20nKQogICAgICAgICkKICAgICAgKQogICAgKSwKICAgIGFwcGVuZCgKICAgICAgc2NhbGVzX3BhcmFtZXRlcnNfd2l0aG91dChzY2FsZV90b19leGNsdWRlID0gbmR2aSwgcG9zdHNjcmlwdCA9ICduZHZpJyksCiAgICAgIHNjYWxlc19wYXJhbWV0ZXJzX3dpdGhvdXQoc2NhbGVfdG9fZXhjbHVkZSA9IHBlcmNlbnRhZ2VfcHJvdGVjdGVkLCBwb3N0c2NyaXB0ID0gJ3BlcmNlbnRhZ2VfcHJvdGVjdGVkJykKICAgICkKICApCn0KYGBgCgpgYGB7cn0Kc2VsZWN0X3NjYWxlcyh1cmJhbiA9IDIwLCBjdWx0aXZhdGVkID0gMTAwLCBlbGV2YXRpb25fZGVsdGEgPSAyMCwgbWVhbl9lbGV2YXRpb24gPSAxMDAsIGF2ZXJhZ2VfcG9wX2RlbnNpdHkgPSBOQSwgaW5jbHVkZXNfZXN0dWFyeSA9IE5BLCBzc20gPSAyMCwgc3VzbSA9IDIwLCBuZHZpID0gMTAwLCBwZXJjZW50YWdlX3Byb3RlY3RlZCA9IE5BKQpgYGAKCnNlbGVjdF9zY2FsZXModXJiYW4gPSAsIGN1bHRpdmF0ZWQgPSAsIGVsZXZhdGlvbl9kZWx0YSA9ICwgbWVhbl9lbGV2YXRpb24gPSAsIGF2ZXJhZ2VfcG9wX2RlbnNpdHkgPSAsIGluY2x1ZGVzX2VzdHVhcnkgPSAsIHNzbSA9ICwgc3VzbSA9ICwgbmR2aSA9LCBwZXJjZW50YWdlX3Byb3RlY3RlZCA9ICkKCmBgYHtyfQpzZWxlY3RfdmFyaWFibGVzX2Zyb21fcmFuZG9tX2ZvcmVzdChtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkKQpgYGAKCmBgYHtyfQpleGNsdWRlX21lcmxpbiA8LSAhbmFtZXMobWVybGluX2NpdHlfZGF0YV9maXhlZCkgJWluJSBzZWxlY3Rfc2NhbGVzKHVyYmFuID0gMjAsIGN1bHRpdmF0ZWQgPSAyMCwgZWxldmF0aW9uX2RlbHRhID0gNTAsIG1lYW5fZWxldmF0aW9uID0gMjAsIGF2ZXJhZ2VfcG9wX2RlbnNpdHkgPSA1MCwgaW5jbHVkZXNfZXN0dWFyeSA9IE5BLCBzc20gPSA1MCwgc3VzbSA9IDEwMCwgbmR2aSA9NTAsIHBlcmNlbnRhZ2VfcHJvdGVjdGVkID0gNTApCgptZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX3NpbmdsZV9zY2FsZSA8LSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkWyxleGNsdWRlX21lcmxpbl0KbWVybGluX2NpdHlfZGF0YV9maXhlZF9zaW5nbGVfc2NhbGUKYGBgCgpgYGB7cn0Kc2VsZWN0X3ZhcmlhYmxlc19mcm9tX3JhbmRvbV9mb3Jlc3QobWVybGluX2NpdHlfZGF0YV9maXhlZF9zaW5nbGVfc2NhbGUpCmBgYAoKYGBge3J9CmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJyZWdpb25fNTBrbV9zc20iKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJyZWdpb25fNTBrbV9zc20iLCAicmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IobWVybGluX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicmVnaW9uXzUwa21fc3NtIiwgInJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSIsICJiaW9tZV9uYW1lIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IobWVybGluX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicmVnaW9uXzUwa21fc3NtIiwgInJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSIsICJiaW9tZV9uYW1lIiwgImNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IobWVybGluX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicmVnaW9uXzUwa21fc3NtIiwgInJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSIsICJiaW9tZV9uYW1lIiwgImNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uIiwgInBlcm1hbmVudF93YXRlciIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInJlZ2lvbl81MGttX3NzbSIsICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiLCAiYmlvbWVfbmFtZSIsICJjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiIsICJwZXJtYW5lbnRfd2F0ZXIiLCAiY2l0eV9uZHZpIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IobWVybGluX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicmVnaW9uXzUwa21fc3NtIiwgInJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSIsICJiaW9tZV9uYW1lIiwgImNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uIiwgInBlcm1hbmVudF93YXRlciIsICJjaXR5X25kdmkiLCAidGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UiKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJyZWdpb25fNTBrbV9zc20iLCAicmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhIiwgImJpb21lX25hbWUiLCAiY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24iLCAicGVybWFuZW50X3dhdGVyIiwgImNpdHlfbmR2aSIsICJ0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSIsICAicmVnaW9uXzIwa21fY3VsdGl2YXRlZCIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInJlZ2lvbl81MGttX3NzbSIsICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiLCAiYmlvbWVfbmFtZSIsICJjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiIsICJwZXJtYW5lbnRfd2F0ZXIiLCAiY2l0eV9uZHZpIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgICJyZWdpb25fMjBrbV9jdWx0aXZhdGVkIiwgInNocnVicyIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInJlZ2lvbl81MGttX3NzbSIsICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiLCAiYmlvbWVfbmFtZSIsICJjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiIsICJwZXJtYW5lbnRfd2F0ZXIiLCAiY2l0eV9uZHZpIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgICJyZWdpb25fMjBrbV9jdWx0aXZhdGVkIiwgInNocnVicyIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInJlZ2lvbl81MGttX3NzbSIsICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiLCAiYmlvbWVfbmFtZSIsICJjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiIsICJwZXJtYW5lbnRfd2F0ZXIiLCAiY2l0eV9uZHZpIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgICJyZWdpb25fMjBrbV9jdWx0aXZhdGVkIiwgInNocnVicyIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJyZWdpb25fMjBrbV91cmJhbiIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInJlZ2lvbl81MGttX3NzbSIsICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiLCAiYmlvbWVfbmFtZSIsICJjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiIsICJwZXJtYW5lbnRfd2F0ZXIiLCAiY2l0eV9uZHZpIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgICJyZWdpb25fMjBrbV9jdWx0aXZhdGVkIiwgInNocnVicyIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJyZWdpb25fMjBrbV91cmJhbiIsICJoZXJiYWNlb3VzX3dldGxhbmQiKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJyZWdpb25fNTBrbV9zc20iLCAicmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhIiwgImJpb21lX25hbWUiLCAiY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24iLCAicGVybWFuZW50X3dhdGVyIiwgImNpdHlfbmR2aSIsICJ0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSIsICAicmVnaW9uXzIwa21fY3VsdGl2YXRlZCIsICJzaHJ1YnMiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicmVnaW9uXzIwa21fdXJiYW4iLCAiaGVyYmFjZW91c193ZXRsYW5kIiwgImNpdHlfbWF4X3BvcF9kZW5zaXR5IildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IobWVybGluX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicmVnaW9uXzUwa21fc3NtIiwgInJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSIsICJiaW9tZV9uYW1lIiwgImNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uIiwgInBlcm1hbmVudF93YXRlciIsICJjaXR5X25kdmkiLCAidGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UiLCAgInJlZ2lvbl8yMGttX2N1bHRpdmF0ZWQiLCAic2hydWJzIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInJlZ2lvbl8yMGttX3VyYmFuIiwgImhlcmJhY2VvdXNfd2V0bGFuZCIsICJjaXR5X21heF9wb3BfZGVuc2l0eSIsICJjaXR5X3NzbSIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInJlZ2lvbl81MGttX3NzbSIsICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiLCAiYmlvbWVfbmFtZSIsICJjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiIsICJwZXJtYW5lbnRfd2F0ZXIiLCAiY2l0eV9uZHZpIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgICJyZWdpb25fMjBrbV9jdWx0aXZhdGVkIiwgInNocnVicyIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJyZWdpb25fMjBrbV91cmJhbiIsICJoZXJiYWNlb3VzX3dldGxhbmQiLCAiY2l0eV9tYXhfcG9wX2RlbnNpdHkiLCAiY2l0eV9zc20iLCAicmVnaW9uXzUwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInJlZ2lvbl81MGttX3NzbSIsICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiLCAiYmlvbWVfbmFtZSIsICJjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiIsICJwZXJtYW5lbnRfd2F0ZXIiLCAiY2l0eV9uZHZpIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgICJyZWdpb25fMjBrbV9jdWx0aXZhdGVkIiwgInNocnVicyIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJyZWdpb25fMjBrbV91cmJhbiIsICJoZXJiYWNlb3VzX3dldGxhbmQiLCAiY2l0eV9tYXhfcG9wX2RlbnNpdHkiLCAiY2l0eV9zc20iLCAicmVnaW9uXzUwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJjaXR5X2F2ZXJhZ2VfcG9wX2RlbnNpdHkiKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJyZWdpb25fNTBrbV9zc20iLCAicmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhIiwgImJpb21lX25hbWUiLCAiY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24iLCAicGVybWFuZW50X3dhdGVyIiwgImNpdHlfbmR2aSIsICJ0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSIsICAicmVnaW9uXzIwa21fY3VsdGl2YXRlZCIsICJzaHJ1YnMiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicmVnaW9uXzIwa21fdXJiYW4iLCAiaGVyYmFjZW91c193ZXRsYW5kIiwgImNpdHlfbWF4X3BvcF9kZW5zaXR5IiwgImNpdHlfc3NtIiwgInJlZ2lvbl81MGttX2F2ZXJhZ2VfcG9wX2RlbnNpdHkiLCAiY2l0eV9hdmVyYWdlX3BvcF9kZW5zaXR5IiwgInJlYWxtIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IobWVybGluX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicmVnaW9uXzUwa21fc3NtIiwgInJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSIsICJiaW9tZV9uYW1lIiwgImNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uIiwgInBlcm1hbmVudF93YXRlciIsICJjaXR5X25kdmkiLCAidGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UiLCAgInJlZ2lvbl8yMGttX2N1bHRpdmF0ZWQiLCAic2hydWJzIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInJlZ2lvbl8yMGttX3VyYmFuIiwgImhlcmJhY2VvdXNfd2V0bGFuZCIsICJjaXR5X21heF9wb3BfZGVuc2l0eSIsICJjaXR5X3NzbSIsICJyZWdpb25fNTBrbV9hdmVyYWdlX3BvcF9kZW5zaXR5IiwgImNpdHlfYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJyZWFsbSIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21heCIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInJlZ2lvbl81MGttX3NzbSIsICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiLCAiYmlvbWVfbmFtZSIsICJjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiIsICJwZXJtYW5lbnRfd2F0ZXIiLCAiY2l0eV9uZHZpIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgICJyZWdpb25fMjBrbV9jdWx0aXZhdGVkIiwgInNocnVicyIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJyZWdpb25fMjBrbV91cmJhbiIsICJoZXJiYWNlb3VzX3dldGxhbmQiLCAiY2l0eV9tYXhfcG9wX2RlbnNpdHkiLCAiY2l0eV9zc20iLCAicmVnaW9uXzUwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJjaXR5X2F2ZXJhZ2VfcG9wX2RlbnNpdHkiLCAicmVhbG0iLCAidGVtcGVyYXR1cmVfbW9udGhseV9tYXgiLCAiaGFwcGluZXNzX3Bvc2l0aXZlX2VmZmVjdCIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInJlZ2lvbl81MGttX3NzbSIsICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiLCAiYmlvbWVfbmFtZSIsICJjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiIsICJwZXJtYW5lbnRfd2F0ZXIiLCAiY2l0eV9uZHZpIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgICJyZWdpb25fMjBrbV9jdWx0aXZhdGVkIiwgInNocnVicyIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJyZWdpb25fMjBrbV91cmJhbiIsICJoZXJiYWNlb3VzX3dldGxhbmQiLCAiY2l0eV9tYXhfcG9wX2RlbnNpdHkiLCAiY2l0eV9zc20iLCAicmVnaW9uXzUwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJjaXR5X2F2ZXJhZ2VfcG9wX2RlbnNpdHkiLCAicmVhbG0iLCAidGVtcGVyYXR1cmVfbW9udGhseV9tYXgiLCAiaGFwcGluZXNzX3Bvc2l0aXZlX2VmZmVjdCIsICJyZWdpb25fNTBrbV9wZXJjZW50YWdlX3Byb3RlY3RlZCIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInJlZ2lvbl81MGttX3NzbSIsICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiLCAiYmlvbWVfbmFtZSIsICJjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiIsICJwZXJtYW5lbnRfd2F0ZXIiLCAiY2l0eV9uZHZpIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgICJyZWdpb25fMjBrbV9jdWx0aXZhdGVkIiwgInNocnVicyIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJyZWdpb25fMjBrbV91cmJhbiIsICJoZXJiYWNlb3VzX3dldGxhbmQiLCAiY2l0eV9tYXhfcG9wX2RlbnNpdHkiLCAiY2l0eV9zc20iLCAicmVnaW9uXzUwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJjaXR5X2F2ZXJhZ2VfcG9wX2RlbnNpdHkiLCAicmVhbG0iLCAidGVtcGVyYXR1cmVfbW9udGhseV9tYXgiLCAiaGFwcGluZXNzX3Bvc2l0aXZlX2VmZmVjdCIsICJyZWdpb25fNTBrbV9wZXJjZW50YWdlX3Byb3RlY3RlZCIsICJyYWluZmFsbF9tb250aGx5X21heCIpXSkKYGBgCgoicmVnaW9uXzUwa21fc3NtIiwgInJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSIsICJiaW9tZV9uYW1lIiwgImNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uIgoKCmBgYHtyfQpiaXJkbGlmZV9jaXR5X2RhdGEgPC0gZmV0Y2hfY2l0eV9kYXRhX2ZvcignYmlyZGxpZmUnKQpiaXJkbGlmZV9jaXR5X2RhdGEKYGBgCgpgYGB7cn0KZ2dwbG90KGJpcmRsaWZlX2NpdHlfZGF0YSwgYWVzKHJlc3BvbnNlKSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEpCmBgYAoKYGBge3J9CmJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZCA8LSByZkltcHV0ZShyZXNwb25zZSB+IC4sIGJpcmRsaWZlX2NpdHlfZGF0YSkKYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkCmBgYAoKYGBge3J9CnNlbGVjdF92YXJpYWJsZXNfZnJvbV9yYW5kb21fZm9yZXN0KGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZCkKYGBgCgpgYGB7cn0KZXhjbHVkZV9iaXJkbGlmZSA8LSAhbmFtZXMoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkKSAlaW4lIHNlbGVjdF9zY2FsZXModXJiYW4gPSAxMDAsIGN1bHRpdmF0ZWQgPSAxMDAsIGVsZXZhdGlvbl9kZWx0YSA9IDIwLCBtZWFuX2VsZXZhdGlvbiA9IDEwMCwgYXZlcmFnZV9wb3BfZGVuc2l0eSA9IDIwLCBpbmNsdWRlc19lc3R1YXJ5ID0gTkEsIHNzbSA9IDUwLCBzdXNtID0gMTAwLCBuZHZpID0gNTAsIHBlcmNlbnRhZ2VfcHJvdGVjdGVkID0gMTAwKQoKYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX3NpbmdsZV9zY2FsZSA8LSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRbLGV4Y2x1ZGVfYmlyZGxpZmVdCmJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9zaW5nbGVfc2NhbGUKYGBgCgpgYGB7cn0Kc2VsZWN0X3ZhcmlhYmxlc19mcm9tX3JhbmRvbV9mb3Jlc3QoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX3NpbmdsZV9zY2FsZSkKYGBgCgpgYGB7cn0KY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicG9wdWxhdGlvbl9ncm93dGgiKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInBvcHVsYXRpb25fZ3Jvd3RoIiwgInJlZ2lvbl81MGttX3NzbSIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicG9wdWxhdGlvbl9ncm93dGgiLCAicmVnaW9uXzUwa21fc3NtIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJwb3B1bGF0aW9uX2dyb3d0aCIsICJyZWdpb25fNTBrbV9zc20iLCAicmVnaW9uXzEwMGttX2N1bHRpdmF0ZWQiLCAiY2l0eV9uZHZpIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJwb3B1bGF0aW9uX2dyb3d0aCIsICJyZWdpb25fNTBrbV9zc20iLCAicmVnaW9uXzEwMGttX2N1bHRpdmF0ZWQiLCAiY2l0eV9uZHZpIiwgImJpb21lX25hbWUiKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInBvcHVsYXRpb25fZ3Jvd3RoIiwgInJlZ2lvbl81MGttX3NzbSIsICJyZWdpb25fMTAwa21fY3VsdGl2YXRlZCIsICJjaXR5X25kdmkiLCAiYmlvbWVfbmFtZSIsICJjaXR5X25kdmkiKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInBvcHVsYXRpb25fZ3Jvd3RoIiwgInJlZ2lvbl81MGttX3NzbSIsICJyZWdpb25fMTAwa21fY3VsdGl2YXRlZCIsICJjaXR5X25kdmkiLCAiYmlvbWVfbmFtZSIsICJjaXR5X25kdmkiLCAicmVnaW9uXzIwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicG9wdWxhdGlvbl9ncm93dGgiLCAicmVnaW9uXzUwa21fc3NtIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIiwgImNpdHlfbmR2aSIsICJiaW9tZV9uYW1lIiwgImNpdHlfbmR2aSIsICJyZWdpb25fMjBrbV9hdmVyYWdlX3BvcF9kZW5zaXR5IiwgInBlcm1hbmVudF93YXRlciIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicG9wdWxhdGlvbl9ncm93dGgiLCAicmVnaW9uXzUwa21fc3NtIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIiwgImNpdHlfbmR2aSIsICJiaW9tZV9uYW1lIiwgImNpdHlfbmR2aSIsICJyZWdpb25fMjBrbV9hdmVyYWdlX3BvcF9kZW5zaXR5IiwgInBlcm1hbmVudF93YXRlciIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicG9wdWxhdGlvbl9ncm93dGgiLCAicmVnaW9uXzUwa21fc3NtIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIiwgImNpdHlfbmR2aSIsICJiaW9tZV9uYW1lIiwgImNpdHlfbmR2aSIsICJyZWdpb25fMjBrbV9hdmVyYWdlX3BvcF9kZW5zaXR5IiwgInBlcm1hbmVudF93YXRlciIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzX2FuZF9zdHJlZXRzIildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJwb3B1bGF0aW9uX2dyb3d0aCIsICJyZWdpb25fNTBrbV9zc20iLCAicmVnaW9uXzEwMGttX2N1bHRpdmF0ZWQiLCAiY2l0eV9uZHZpIiwgImJpb21lX25hbWUiLCAiY2l0eV9uZHZpIiwgInJlZ2lvbl8yMGttX2F2ZXJhZ2VfcG9wX2RlbnNpdHkiLCAicGVybWFuZW50X3dhdGVyIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXNfYW5kX3N0cmVldHMiLCAicmVnaW9uXzUwa21fbmR2aSIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicG9wdWxhdGlvbl9ncm93dGgiLCAicmVnaW9uXzUwa21fc3NtIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIiwgImNpdHlfbmR2aSIsICJiaW9tZV9uYW1lIiwgImNpdHlfbmR2aSIsICJyZWdpb25fMjBrbV9hdmVyYWdlX3BvcF9kZW5zaXR5IiwgInBlcm1hbmVudF93YXRlciIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzX2FuZF9zdHJlZXRzIiwgInJlZ2lvbl81MGttX25kdmkiLCAidGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UiKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInBvcHVsYXRpb25fZ3Jvd3RoIiwgInJlZ2lvbl81MGttX3NzbSIsICJyZWdpb25fMTAwa21fY3VsdGl2YXRlZCIsICJjaXR5X25kdmkiLCAiYmlvbWVfbmFtZSIsICJjaXR5X25kdmkiLCAicmVnaW9uXzIwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJwZXJtYW5lbnRfd2F0ZXIiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlc19hbmRfc3RyZWV0cyIsICJyZWdpb25fNTBrbV9uZHZpIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgInJlZ2lvbl8xMDBrbV91cmJhbiIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicG9wdWxhdGlvbl9ncm93dGgiLCAicmVnaW9uXzUwa21fc3NtIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIiwgImNpdHlfbmR2aSIsICJiaW9tZV9uYW1lIiwgImNpdHlfbmR2aSIsICJyZWdpb25fMjBrbV9hdmVyYWdlX3BvcF9kZW5zaXR5IiwgInBlcm1hbmVudF93YXRlciIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzX2FuZF9zdHJlZXRzIiwgInJlZ2lvbl81MGttX25kdmkiLCAidGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UiLCAicmVnaW9uXzEwMGttX3VyYmFuIiwgInJlZ2lvbl8yMGttX2VsZXZhdGlvbl9kZWx0YSIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicG9wdWxhdGlvbl9ncm93dGgiLCAicmVnaW9uXzUwa21fc3NtIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIiwgImNpdHlfbmR2aSIsICJiaW9tZV9uYW1lIiwgImNpdHlfbmR2aSIsICJyZWdpb25fMjBrbV9hdmVyYWdlX3BvcF9kZW5zaXR5IiwgInBlcm1hbmVudF93YXRlciIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzX2FuZF9zdHJlZXRzIiwgInJlZ2lvbl81MGttX25kdmkiLCAidGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UiLCAicmVnaW9uXzEwMGttX3VyYmFuIiwgInJlZ2lvbl8yMGttX2VsZXZhdGlvbl9kZWx0YSIsICJyYWluZmFsbF9hbm51YWxfYXZlcmFnZSIpXSkKY3JlYXRlX2ZpZnR5X3Jvd3Nfb2Zfb29iKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZFssYygicmVzcG9uc2UiLCAicG9wdWxhdGlvbl9ncm93dGgiLCAicmVnaW9uXzUwa21fc3NtIiwgInJlZ2lvbl8xMDBrbV9jdWx0aXZhdGVkIiwgImNpdHlfbmR2aSIsICJiaW9tZV9uYW1lIiwgImNpdHlfbmR2aSIsICJyZWdpb25fMjBrbV9hdmVyYWdlX3BvcF9kZW5zaXR5IiwgInBlcm1hbmVudF93YXRlciIsICJ0ZW1wZXJhdHVyZV9tb250aGx5X21pbiIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzX2FuZF9zdHJlZXRzIiwgInJlZ2lvbl81MGttX25kdmkiLCAidGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UiLCAicmVnaW9uXzEwMGttX3VyYmFuIiwgInJlZ2lvbl8yMGttX2VsZXZhdGlvbl9kZWx0YSIsICJyYWluZmFsbF9hbm51YWxfYXZlcmFnZSIsICJzaGFyZV9vZl9wb3B1bGF0aW9uX3dpdGhpbl80MDBtX29mX29wZW5fc3BhY2UiKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInBvcHVsYXRpb25fZ3Jvd3RoIiwgInJlZ2lvbl81MGttX3NzbSIsICJyZWdpb25fMTAwa21fY3VsdGl2YXRlZCIsICJjaXR5X25kdmkiLCAiYmlvbWVfbmFtZSIsICJjaXR5X25kdmkiLCAicmVnaW9uXzIwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJwZXJtYW5lbnRfd2F0ZXIiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlc19hbmRfc3RyZWV0cyIsICJyZWdpb25fNTBrbV9uZHZpIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgInJlZ2lvbl8xMDBrbV91cmJhbiIsICJyZWdpb25fMjBrbV9lbGV2YXRpb25fZGVsdGEiLCAicmFpbmZhbGxfYW5udWFsX2F2ZXJhZ2UiLCAic2hhcmVfb2ZfcG9wdWxhdGlvbl93aXRoaW5fNDAwbV9vZl9vcGVuX3NwYWNlIiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXMiKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInBvcHVsYXRpb25fZ3Jvd3RoIiwgInJlZ2lvbl81MGttX3NzbSIsICJyZWdpb25fMTAwa21fY3VsdGl2YXRlZCIsICJjaXR5X25kdmkiLCAiYmlvbWVfbmFtZSIsICJjaXR5X25kdmkiLCAicmVnaW9uXzIwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJwZXJtYW5lbnRfd2F0ZXIiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlc19hbmRfc3RyZWV0cyIsICJyZWdpb25fNTBrbV9uZHZpIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgInJlZ2lvbl8xMDBrbV91cmJhbiIsICJyZWdpb25fMjBrbV9lbGV2YXRpb25fZGVsdGEiLCAicmFpbmZhbGxfYW5udWFsX2F2ZXJhZ2UiLCAic2hhcmVfb2ZfcG9wdWxhdGlvbl93aXRoaW5fNDAwbV9vZl9vcGVuX3NwYWNlIiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXMiLCAibWVhbl9wb3B1bGF0aW9uX2V4cG9zdXJlX3RvX3BtMl81XzIwMTkiKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInBvcHVsYXRpb25fZ3Jvd3RoIiwgInJlZ2lvbl81MGttX3NzbSIsICJyZWdpb25fMTAwa21fY3VsdGl2YXRlZCIsICJjaXR5X25kdmkiLCAiYmlvbWVfbmFtZSIsICJjaXR5X25kdmkiLCAicmVnaW9uXzIwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJwZXJtYW5lbnRfd2F0ZXIiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlc19hbmRfc3RyZWV0cyIsICJyZWdpb25fNTBrbV9uZHZpIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgInJlZ2lvbl8xMDBrbV91cmJhbiIsICJyZWdpb25fMjBrbV9lbGV2YXRpb25fZGVsdGEiLCAicmFpbmZhbGxfYW5udWFsX2F2ZXJhZ2UiLCAic2hhcmVfb2ZfcG9wdWxhdGlvbl93aXRoaW5fNDAwbV9vZl9vcGVuX3NwYWNlIiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXMiLCAibWVhbl9wb3B1bGF0aW9uX2V4cG9zdXJlX3RvX3BtMl81XzIwMTkiLCAiY2l0eV9hdmVyYWdlX3BvcF9kZW5zaXR5IildKQpjcmVhdGVfZmlmdHlfcm93c19vZl9vb2IoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkWyxjKCJyZXNwb25zZSIsICJwb3B1bGF0aW9uX2dyb3d0aCIsICJyZWdpb25fNTBrbV9zc20iLCAicmVnaW9uXzEwMGttX2N1bHRpdmF0ZWQiLCAiY2l0eV9uZHZpIiwgImJpb21lX25hbWUiLCAiY2l0eV9uZHZpIiwgInJlZ2lvbl8yMGttX2F2ZXJhZ2VfcG9wX2RlbnNpdHkiLCAicGVybWFuZW50X3dhdGVyIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXNfYW5kX3N0cmVldHMiLCAicmVnaW9uXzUwa21fbmR2aSIsICJ0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSIsICJyZWdpb25fMTAwa21fdXJiYW4iLCAicmVnaW9uXzIwa21fZWxldmF0aW9uX2RlbHRhIiwgInJhaW5mYWxsX2FubnVhbF9hdmVyYWdlIiwgInNoYXJlX29mX3BvcHVsYXRpb25fd2l0aGluXzQwMG1fb2Zfb3Blbl9zcGFjZSIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzIiwgIm1lYW5fcG9wdWxhdGlvbl9leHBvc3VyZV90b19wbTJfNV8yMDE5IiwgImNpdHlfYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJzaHJ1YnMiKV0pCmNyZWF0ZV9maWZ0eV9yb3dzX29mX29vYihiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRbLGMoInJlc3BvbnNlIiwgInBvcHVsYXRpb25fZ3Jvd3RoIiwgInJlZ2lvbl81MGttX3NzbSIsICJyZWdpb25fMTAwa21fY3VsdGl2YXRlZCIsICJjaXR5X25kdmkiLCAiYmlvbWVfbmFtZSIsICJjaXR5X25kdmkiLCAicmVnaW9uXzIwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJwZXJtYW5lbnRfd2F0ZXIiLCAidGVtcGVyYXR1cmVfbW9udGhseV9taW4iLCAicGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlc19hbmRfc3RyZWV0cyIsICJyZWdpb25fNTBrbV9uZHZpIiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgInJlZ2lvbl8xMDBrbV91cmJhbiIsICJyZWdpb25fMjBrbV9lbGV2YXRpb25fZGVsdGEiLCAicmFpbmZhbGxfYW5udWFsX2F2ZXJhZ2UiLCAic2hhcmVfb2ZfcG9wdWxhdGlvbl93aXRoaW5fNDAwbV9vZl9vcGVuX3NwYWNlIiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXMiLCAibWVhbl9wb3B1bGF0aW9uX2V4cG9zdXJlX3RvX3BtMl81XzIwMTkiLCAiY2l0eV9hdmVyYWdlX3BvcF9kZW5zaXR5IiwgInNocnVicyIsICJjaXR5X3N1c20iKV0pCmBgYAoKInBvcHVsYXRpb25fZ3Jvd3RoIiwgInJlZ2lvbl81MGttX3NzbSIKCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KU28uLi4uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpNZXJsaW46ICJyZWdpb25fNTBrbV9zc20iLCAicmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhIiwgImJpb21lX25hbWUiLCAiY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24iCkJpcmRsaWZlOiAicG9wdWxhdGlvbl9ncm93dGgiLCAicmVnaW9uXzUwa21fc3NtIgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KVHJ5IE1vZGVsbGluZwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmxpYnJhcnkoYm9vdCkKYGBgCgoKCmBgYHtyfQptZXJsaW5fY2l0eV9kYXRhX25hbWVkIDwtIGZldGNoX2NpdHlfZGF0YV9mb3IoJ21lcmxpbicsIFQpCmJpcmRsaWZlX2NpdHlfZGF0YV9uYW1lZCA8LSBmZXRjaF9jaXR5X2RhdGFfZm9yKCdiaXJkbGlmZScsIFQpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClVzZSBjcm9zcyB2YWxpZGF0aW9uIGFuZCBkcm9wcGluZyB0ZXJtcyB0byBmaW5kIGJlc3QgbW9kZWwKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmdWxsIG1vZGVsOiAgcmVzcG9uc2UgfiByZWdpb25fNTBrbV9zc20gKyByZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEgKyBiaW9tZV9uYW1lICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBwb3B1bGF0aW9uX2dyb3d0aAoKCk1lcmxpbiBkYXRhIHNldAotLS0tLS0tLS0tLS0tLS0tCgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzUwa21fc3NtICsgcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhICsgYmlvbWVfbmFtZSArIGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uICsgcG9wdWxhdGlvbl9ncm93dGgsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKLS0gQ1ZFIDE5LjQ3MzIyCi0tIENhbiB3ZSBkcm9wIG9uZT8KCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEgKyBiaW9tZV9uYW1lICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBwb3B1bGF0aW9uX2dyb3d0aCwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzUwa21fc3NtICsgYmlvbWVfbmFtZSArIGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uICsgcG9wdWxhdGlvbl9ncm93dGgsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl81MGttX3NzbSArIHJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSArIGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uICsgcG9wdWxhdGlvbl9ncm93dGgsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl81MGttX3NzbSArIHJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSArIGJpb21lX25hbWUgKyBwb3B1bGF0aW9uX2dyb3d0aCwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzUwa21fc3NtICsgcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhICsgYmlvbWVfbmFtZSArIGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCi0tIGRyb3AgYmlvbWVfbmFtZSB0byBnaXZlIHNtYWxsZXIgQ1ZFIG9mIDE4LjM1NzMyCi0tIGNhbiB3ZSBkcm9wIGFub3RoZXI/CgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBwb3B1bGF0aW9uX2dyb3d0aCwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzUwa21fc3NtICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBwb3B1bGF0aW9uX2dyb3d0aCwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzUwa21fc3NtICsgcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhICsgcG9wdWxhdGlvbl9ncm93dGgsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl81MGttX3NzbSArIHJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSArIGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCi0tIGRyb3AgcG9wdWxhdGlvbl9ncm93dGggdG8gZ2l2ZSBDVkUgb2YgMTguMDI2NjYKLS0gY2FuIHdlIGRyb3AgYW5vdGhlcj8KCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEgKyBjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzUwa21fc3NtICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24sIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl81MGttX3NzbSArIHJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgotLSBkcm9wIGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uIHRvIGdpdmUgQ1ZFIG9mIDE3LjkzNjIKLS0gY2FuIHdlIGRyb3AgYW5vdGhlcj8KCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl81MGttX3NzbSwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0gYmVzdCBtb2RlbCB3aXRoIHJlZ2lvbl81MGttX3NzbSArIHJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSAoQ1YgZXJyb3IgMTcuOTM2MikKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmBgYHtyfQpzdW1tYXJ5KGdsbShkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZCwgZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzUwa21fc3NtICsgcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhKSkKYGBgCgoKQmlyZGxpZmUgZGF0YSBzZXQKLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmN2LmdsbShiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzUwa21fc3NtICsgcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhICsgYmlvbWVfbmFtZSArIGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uICsgcG9wdWxhdGlvbl9ncm93dGgsIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgotLSBjYW4gd2UgZHJvcCBhIHZhcmlhYmxlPwoKYGBge3J9CmN2LmdsbShiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhICsgYmlvbWVfbmFtZSArIGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uICsgcG9wdWxhdGlvbl9ncm93dGgsIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fNTBrbV9zc20gKyBiaW9tZV9uYW1lICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBwb3B1bGF0aW9uX2dyb3d0aCwgZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl81MGttX3NzbSArIHJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSArIGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uICsgcG9wdWxhdGlvbl9ncm93dGgsIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fNTBrbV9zc20gKyByZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEgKyBiaW9tZV9uYW1lICsgcG9wdWxhdGlvbl9ncm93dGgsIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fNTBrbV9zc20gKyByZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEgKyBiaW9tZV9uYW1lICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24sIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgotLSBkcm9wIGJpb21lX25hbWUgdG8gZ2l2ZSBDVkUgb2YgNi40NTUxOTMKLS0gY2FuIHdlIGRyb3AgYW5vdGhlcj8KCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSArIGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uICsgcG9wdWxhdGlvbl9ncm93dGgsIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fNTBrbV9zc20gKyBjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiArIHBvcHVsYXRpb25fZ3Jvd3RoLCBkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl81MGttX3NzbSArIHJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSArIHBvcHVsYXRpb25fZ3Jvd3RoLCBkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl81MGttX3NzbSArIHJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSArIGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uLCBkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKLS0gZHJvcCByZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEgdG8gZ2l2ZSBDVkUgb2YgNi4zODQ5NQotLSBjYW4gd2UgZHJvcCBhbm90aGVyPwoKYGBge3J9CmN2LmdsbShiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBwb3B1bGF0aW9uX2dyb3d0aCwgZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl81MGttX3NzbSArIHBvcHVsYXRpb25fZ3Jvd3RoLCBkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKYGBge3J9CmN2LmdsbShiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzUwa21fc3NtICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24sIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgotLSBkcm9wIHBvcHVsYXRpb25fZ3Jvd3RoIHRvIGdpdmUgQ1ZFIG9mIDYuMzMxNTY0Ci0tIGNhbiB3ZSBkcm9wIGFub3RoZXI/CgpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiBjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiwgZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl81MGttX3NzbSwgZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCi0tIGRyb3AgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gdG8gZ2l2ZSBDVkUgb2YgNi4yOTEyOTkKLS0gaXMgdGhpcyBiZXR0ZXIgdGhhbiBubyB2YXJpYWJsZT8KCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IDEsIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCi0tIHllcywganVzdCEKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0gc28gYmVzdCBtb2RlbCB3aXRoIGJpcmRsaWZlIGlzIHJlZ2lvbl81MGttX3NzbQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7cn0Kc3VtbWFyeShnbG0oZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZCwgZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzUwa21fc3NtKSkKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpMZXRzIGxvb2sgYXQgU1NNIGZvciBib3RoIHBvb2xzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7cn0KZ2dwbG90KG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBhZXMoeCA9IHJlZ2lvbl81MGttX3NzbSwgeSA9IHJlc3BvbnNlKSkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX3Ntb290aChtZXRob2QgPSAiZ2xtIiwgc2UgPSBGKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgYWVzKHggPSByZWdpb25fNTBrbV9zc20sIHkgPSByZXNwb25zZSkpICsgZ2VvbV9wb2ludCgpICsgZ2VvbV9zbW9vdGgobWV0aG9kID0gImdsbSIsIHNlID0gRikKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYW5kIGluY2x1ZGUgcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhIGZvciBtZXJsaW4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmBgYHtyfQpnZ3Bsb3QobWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGFlcyh4ID0gcmVnaW9uXzUwa21fc3NtLCB5ID0gcmVzcG9uc2UsIHNpemUgPSByZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEpKSArIGdlb21fcG9pbnQoKSArIGdlb21fc21vb3RoKG1ldGhvZCA9ICJnbG0iLCBzZSA9IEYpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkNoZWNrIGJpcmRsaWZlIG1vZGVsIGZpdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmBgYHtyfQpiaXJkbGlmZS5maXQgPC0gZ2xtKGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fNTBrbV9zc20pCnN1bW1hcnkoYmlyZGxpZmUuZml0KQp3aXRoKHN1bW1hcnkoYmlyZGxpZmUuZml0KSwgMSAtIGRldmlhbmNlL251bGwuZGV2aWFuY2UpCnBsb3QoYmlyZGxpZmUuZml0KQpgYGAKCmBgYHtyfQpiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsW2MoMTYsIDUzLCA3MiksIGMoIm5hbWUiLCAicmVnaW9uXzUwa21fc3NtIildCmBgYAoKYGBge3J9CmdncGxvdChiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBhZXMoeCA9IHJlZ2lvbl81MGttX3NzbSwgeSA9IHJlc3BvbnNlKSkgKyAKICBnZW9tX3BvaW50KHNpemU9MSkgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAiZ2xtIiwgc2UgPSBGKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG5hbWUpLCBkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbFtjKDE2LCA1MywgNzIpLF0sIHNpemUgPSAzLCBwb3NpdGlvbiA9ICJkb2RnZSIsIHZqdXN0ID0gImlud2FyZCIsIGhqdXN0ID0gImlud2FyZCIsIGNvbG9yID0gInJlZCIsIGFuZ2xlPS0xNSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWxbYygxNiwgNTMsIDcyKSxdLCBjb2xvciA9ICJyZWQiKSArCiAgdGhlbWVfYncoKSArCiAgeWxhYigiQ2l0eSBSYW5kb20gRWZmZWN0IEludGVyY2VwdCIpICsgeGxhYigiUmVnaW9uYWwgKDUwa20pIFNTTSIpICsgbGFicyh0aXRsZSA9ICJCaXJkbGlmZSIpCgpnZ3NhdmUoImNpdHlfZWZmZWN0X3JpY2huZXNzX19vdXRwdXRfX2JpcmRsaWZlLmpwZyIpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkNoZWNrIE1lcmxpbiBtb2RlbCBmaXQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7cn0KbWVybGluLmZpdCA8LSBnbG0oZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fNTBrbV9zc20gKyByZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEpCnN1bW1hcnkobWVybGluLmZpdCkKd2l0aChzdW1tYXJ5KG1lcmxpbi5maXQpLCAxIC0gZGV2aWFuY2UvbnVsbC5kZXZpYW5jZSkKcGxvdChtZXJsaW4uZml0KQpgYGAKCmBgYHtyfQpjaXR5X2RhdGFbYygyNCwgMzAsIDQyKSwgYygibmFtZSIsICJyZWdpb25fNTBrbV9zc20iLCAicmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhIildCmBgYAoKYGBge3J9CmdncGxvdChtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgYWVzKHggPSByZWdpb25fNTBrbV9zc20sIHkgPSByZXNwb25zZSkpICsgCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IHJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSkpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImdsbSIsIHNlID0gRikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBuYW1lKSwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsW2MoMjQsIDMwLCA0MiksXSwgc2l6ZSA9IDMsIHBvc2l0aW9uID0gImRvZGdlIiwgdmp1c3QgPSAiaW53YXJkIiwgaGp1c3QgPSAiaW53YXJkIiwgY29sb3IgPSAicmVkIiwgYW5nbGU9LTE1KSArCiAgZ2VvbV9wb2ludChkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWxbYygyNCwgMzAsIDQyKSxdLCBjb2xvciA9ICJyZWQiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArCiAgeWxhYigiQ2l0eSBSYW5kb20gRWZmZWN0IEludGVyY2VwdCIpICsgeGxhYigiUmVnaW9uYWwgKDUwa20pIFNTTSIpICsgbGFicyh0aXRsZSA9ICJlQmlyZCIpICsgZ3VpZGVzKHNpemU9Z3VpZGVfbGVnZW5kKHRpdGxlPSJSZWdpb25hbCAoNTBrbSkgRWxldmF0aW9uIERlbHRhIikpCgpnZ3NhdmUoImNpdHlfZWZmZWN0X3JpY2huZXNzX19vdXRwdXRfX21lcmxpbi5qcGciKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpIb3cgbXVjaCB2YXJpYXRpb24gaGF2ZSB3ZSBleHBsYWluZWQ/Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpgYGB7cn0KbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwkcmVzaWR1YWxzIDwtIHJlc2lkKG1lcmxpbi5maXQpCmdncGxvdChtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgYWVzKHkgPSByZXNwb25zZSwgeCA9IHJlc2lkdWFscykpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSByZWFsbSkpICsgCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG5hbWUpLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWxbYygyNCwgMzAsIDQyKSxdLCBzaXplID0gNCwgcG9zaXRpb24gPSAiZG9kZ2UiLCB2anVzdCA9ICJpbndhcmQiLCBoanVzdCA9ICJpbndhcmQiKSArIAogIGxhYnModGl0bGUgPSAiTWVybGluIiwgc3VidGl0bGUgPSBwYXN0ZSgiQ29ycmVsYXRpb24iLCBjb3IobWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwkcmVzaWR1YWxzLCBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCRyZXNwb25zZSkpKSArCiAgdGhlbWVfYncoKQpgYGAKCmBgYHtyfQpiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsJHJlc2lkdWFscyA8LSByZXNpZChiaXJkbGlmZS5maXQpCmdncGxvdChiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBhZXMoeSA9IHJlc3BvbnNlLCB4ID0gcmVzaWR1YWxzKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEYsIGFscGhhID0gMC41KSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSByZWFsbSkpICsgCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG5hbWUpLCBkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbFtjKDE2LCA1MywgNzIpLF0sIHNpemUgPSA0LCBwb3NpdGlvbiA9ICJkb2RnZSIsIHZqdXN0ID0gImlud2FyZCIsIGhqdXN0ID0gImlud2FyZCIpICsKICBsYWJzKHRpdGxlID0gIkJpcmRsaWZlIiwgc3VidGl0bGUgPSBwYXN0ZSgiQ29ycmVsYXRpb24iLCBjb3IoYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCRyZXNpZHVhbHMsIGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwkcmVzcG9uc2UpKSkgKwogIHRoZW1lX2J3KCkKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkNoZWNrIEFJQwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7cn0KQUlDKAogIGdsbShkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZCwgZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzUwa21fc3NtICsgcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhICsgYmlvbWVfbmFtZSArIGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uICsgcG9wdWxhdGlvbl9ncm93dGgpLAogIGdsbShkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZCwgZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzUwa21fc3NtICsgcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhKQopCmBgYAoKYGBge3J9CkFJQygKICBnbG0oZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZCwgZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzUwa21fc3NtICsgcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhICsgYmlvbWVfbmFtZSArIGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uICsgcG9wdWxhdGlvbl9ncm93dGgpLAogIGdsbShkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkLCBmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fNTBrbV9zc20pCikKYGBg